package com.yugao.fintech.draper.message.queue.client;


import com.yugao.fintech.draper.message.queue.message.AbstractBroadcastMessage;
import com.yugao.fintech.draper.message.queue.message.AbstractGroupMessage;
import com.yugao.fintech.draper.message.queue.support.MessageQueueInterceptor;
import com.yugao.fintech.draper.message.queue.support.MessageQueueInterceptorAccessor;
import com.yugao.fintech.draper.message.queue.support.MessageQueueOperations;

public abstract class MessageQueueTemplate<T extends MessageQueueInterceptor> extends MessageQueueInterceptorAccessor<T> implements MessageQueueOperations {
    /**
     * 发送分组消息，此消息对于同一个消费者组仅会被消费一次
     */
    @Override
    public <T extends AbstractGroupMessage> void send(T message) {
        try {
            // 发送消息前拦截器处理
            sendMessageBefore(message);
            doSend(message);
        } finally {
            // 消息发送后拦截器处理
            sendMessageAfter(message);
        }
    }

    /**
     * 发送广播消息，此消息对于所有订阅的消费者都会收到
     */
    @Override
    public <T extends AbstractBroadcastMessage> void send(T message) {
        try {
            // 发送消息前拦截器处理
            sendMessageBefore(message);
            doSend(message);
        } finally {
            // 消息发送后拦截器处理
            sendMessageAfter(message);
        }
    }

    /**
     * 发送分组消息，此消息对于同一个消费者组仅会被消费一次
     */
    protected abstract <T extends AbstractGroupMessage> void doSend(T message);

    /**
     * 发送广播消息，此消息对于所有订阅的消费者都会收到
     */
    protected abstract <T extends AbstractBroadcastMessage> void doSend(T message);

}
